/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package 学习.上.封装性;
/**
 * @description 封装性
 * @author 俊昭
 * @date 2022/3/20
 *
 * 当我们创建一个类的对象以后，我们可以通过“对象.属性”的方法进赋值，这里复制操作受到 属性数据类型
 * 和存储范围的制约 此外没有制约条件实际我们往往要给属性复制加入额外的限制条件 这个条件不能在属性
 * 声明时体现 我们只能通过方法进行限制的添加 同时我们需要避免用户 通过“对象.属性”的方法进赋值
 * 则需要将属性生声明为私有的 -->此时就体现了封装性
 *
 * 将类的属性私有化 同时提供公共的方法来设置setxxx（）和获取getxxx（）此属性的值
 *
 * 封装性的体现 需要权限修饰符
 *|1 private 类内部
 *|2 缺省(default) 同一个包
 *|3 protected 不同包的子类
 *↓ 4 public 同一个工程
 * 都可以修饰类 和类的内部结构 方法 构造器 内部类 属性
 * 类只能用缺省 或 public
 * 总结 java提供了4中权限修饰符来修饰类及内部结构体现类的内部结构在被调用时的可见性
*/

public class AnimalTest {
    public static void main(String[] args) {
        Animal animal =new Animal();
/*

        animal.name="dahuang";
        animal.age=2;
        animal.legs=4;
        animal.eat();
        animal.show();

        animal.legs=-4;//这样也会执行
        animal.show();//显然是不合理的
        animal.legs=4;//不可访问
*/
        animal.setLegs(6);
        animal.show();

    }
}
class Animal{
    // 将属性私有化
    private String name;
    private int age;
    private int legs;

    // 对属性的设置
    public void setLegs(int l){
        if(l>=0&&l%2==0){
            legs =l;
        }else{
            legs = 0;
        }
    }
    public void setName(String s){
        name = s;
    }
    public void setAge(int i){
        if (i>=0){
            age=i;
        }else{
            System.err.println("不合理的年龄。");
        }
    }

    // 对属性的获取
    public int getLegs(){
        return legs;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return legs;
    }

    // 类的方法
    public void eat(){
        System.out.println("动物可以进食");
    }
    public void show(){
        System.out.println("它的名字是" + name + "," + age + "岁了，有" + legs + "条腿。");
    }
}
